package reflect.annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 注解声明时，可以使用java内置的元注解来限制当前注解的一些操作
 * 例如:
 * @Target: 元注解，用来声明当前注解能够声明在哪些程序元素上
 *          ElementType定义了可以被应用的位置，常见的有:
 *          1.TYPE: 类、接口、枚举
 *          2.FIELD: 字段
 *          3.METHOD: 方法
 *          4.CONSTRUCTOR: 构造方法
 *          5.PARAMETER: 参数
 *          例如:
 *          @Target(ElementType.TYPE): 只能声明在类上
 *          @Target({ElementType.TYPE,ElementType.METHOD}): 只能声明在类或者方法上
 *
 *  @Retention: 元注解，用来声明当前注解的保留级别
 *              有三个可选值，被定义在RetentionPolicy中
 *              1.SOURCE: 在源代码中保留，编译器将不会保留，所以反射获取不到
 *              2.CLASS: 在class文件中保留，但JVM加载class文件时将不会保留，所以反射获取不到
 *              3.RUNTIME: 在运行时保留，JVM加载class文件时将保留，所以反射可以获取到
 *
 *              不指定@Retention时，默认的保留级别是CLASS
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoRunClass {
}
